﻿#define _CRT_SECURE_NO_WARNINGS 1
#include "stdio.h"

//局部变量不赋初值，它的值是随机的
//全局变量如果不初始化，它的默认值为0；
int main(void)
{
	//n个占位符，n+1个参数，参数少了会输出任意值
	float	a= 123.4f;
	float  ar = 111111.111f,br=222222.222f;
	double al = 111111.111,bl=222222.222;
	int	b = 123;
	/*  占位符
		%h:short
		%l:long
		%g:6个有效数字的浮点数。整数部分⼀旦超过6位，就会⾃动转为科学计数法
		%+:显示符号
		%*.*lf:字面小数默认位double类型，可用变量控制位数
		%.3s:输出部分字符串
	*/
	printf("%a\n",a);					//十六进制浮点数
	printf("%x\n",b);					//十六进制整数
	printf("%+i\n",b);					//十进制整数
	printf("%e\n",100.0);				//6位小数，1位非0整数，e+符号+三位指数
	printf("%f\n", ar + br);			//6-7位精度，小数点后面几位有误差
	printf("%*.*lf\n",16,6, al + bl);	//16位精度
	printf("%p\n", &b);					//地址打印
	printf("%.3s\n", "hello");

	/*int input1;
	int input2;*/
	/*
		scanf() 处理数值占位符时，会⾃动过滤空⽩字符，包括空格、制表符、换⾏符等，输入也会过滤
	*/
	//scanf("%d  %d",&input1,&input2);				//加个\n不会报错,但输入会出现问题
	// ⽤⼾输⼊ " -13.45e12# 0"
	//int x;										//输入数据可以不赋初值,最好赋初值，养成好习惯
	//float y;
	//⽤⼾的输⼊先放⼊缓存，等到按下回⻋键后，按照占位符对缓存进⾏解读
	/*scanf("%d", &x);
	printf("%d\n", x);
	scanf("%f", &y);
	printf("%f\n", y);*/

	/*
		scanf() 的返回值是⼀个整数，表⽰成功读取的变量个数。
		如果没有读取任何项，或者匹配失败，则返回 0 。
		如果在成功读取任何数据之前，发⽣了读取错误或者遇到读取到⽂件结尾，则返回常量 EOF (-1)。

		在VS环境中按3次 ctrl+z ，按一次加一次会车，才结束了输⼊

		%[] ：在⽅括号中指定⼀组匹配的字符（⽐如 %[0-9] ），遇到不在集合之中的字符，匹配将会停⽌

		除了 %c 以外，都会⾃动忽略起⾸的空⽩字符,如果要强制跳过字符前的空⽩字符,%c 前加上⼀个空格，表⽰跳过零个或多个空⽩字符。

		%s ，它其实不能简单地等同于字符串。它的规则是，从当前第⼀个⾮空⽩字符开始读起，直到遇到空⽩字符（即空格、换⾏符、制表符等）为⽌

		scanf() 遇到 %s 占位符，会在字符串变量末尾存储⼀个空字符 \0 。

		不安全性：scanf() 将字符串读⼊字符数组时，不会检测字符串是否超过了数组⻓度。所以，储存字符串时，很可能会超过数组的边界，导致预想不到的结果。
		为了防⽌这种情况，使⽤ %s 占位符时，应该指定读⼊字符串的最⻓⻓度，即写成 %[m]s ，其中的 [m] 是⼀个整数，表⽰读取字符串的最⼤⻓度，后
		⾯的字符将被丢弃，注意要给\0预留空间

		赋值忽略符:把 * 加在任何占位符的百分号后⾯，该占位符就不会返回值，解析后将被丢弃
	*/
	int temp1 = 0;
	int temp2 = 0;
	int temp3 = 0;
	int temp4 = 0;
	int count=scanf("%d%*c%d%*c%d%*c%d", &temp1, &temp2, &temp3, &temp4);
	printf("%d%d%d%d\n", temp1, temp2, temp3, temp4);
	printf("count=%d\n", count);
	
	return 0;
}
